package com.founder.devwork.converter;

import com.founder.devwork.entity.Repository;
import com.founder.devwork.persistence.gateway.gitlab.dto.RepoDTO;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.List;
import java.util.stream.Collectors;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.Named;

/**
 * GitRepositoryConverter 用于将 Git 仓库信息转换为系统仓库信息。
 * 提供从 RepoDTO 到 Repository 的转换方法。
 */
@Mapper(componentModel = "spring")
public interface GitRepositoryConverter {
    /**
     * 将 Git 仓库信息转换为系统仓库信息。
     * @param dto Git 仓库信息
     * @return 系统仓库信息
     */
    @Mapping(target = "id", ignore = true)
    @Mapping(source = "id", target = "gitId")
    @Mapping(source = "lastActivityAt", target = "lastActivityAt", qualifiedByName = "toLocalDateTime")
    @Mapping(target = "updatedAt", ignore = true)
    @Mapping(target = "gitInstance", ignore = true)
    @Mapping(source = "branches", target = "branchIds", qualifiedByName = "toBranchIds")
    Repository gitRepoDtoToEntity(RepoDTO dto);

    /**
     * 将 Instant 转换为 LocalDateTime。
     * @param instant Instant 时间
     * @return LocalDateTime 时间
     */
    @Named("toLocalDateTime")
    default LocalDateTime toLocalDateTime(Instant instant) {
        return instant.atZone(ZoneId.systemDefault()).toLocalDateTime();
    }

    /**
     * 将分支列表转换为逗号分隔的字符串。
     * @param branches 分支列表
     * @return 逗号分隔的字符串
     */
    @Named("toBranchIds")
    default String toBranchIds(List<String> branches) {
        return branches.stream().collect(Collectors.joining(","));
    }
}
